OPC Server

信息系统软件

OPC是OLE for Process Control的缩写。

协定简介
在现今的工业自动化中,我们需要一套整合的信息系统,由底层的各项装置采集信息 (Field Management),中层的控制系统或图控应用程序进行程序的控制 (Process Management),再由最上层的整合软件将这些信息整合起来以供企业决策或效能提升
OPC 为硬件制造商与软件开发商提供了一条桥梁,透过硬件厂商提供的 OPC Server 接口,软件开发者不必考虑各项不同硬件间的差异,便可自硬件端取得所需的信息,所以软件开发者仅需专注于程序本身的控制流程的运作。此外,由于 COM/DCOM 实作并隐藏了网络的细节,透过 OPC 可以很容易地达成远程控制的理想。
原理
在说明 OPC Server/Client 运作方式之前,我们先简单介绍一下 Microsoft 发展的 COM/DCOM 是什么?
COM 是一种发展软件组件的方法,所谓的软件组件,是指一个可以提供应用程序、操作系统、以及其它组件服务二进制可执行程序。事实上,发展自订的 COM 对象就好象是在建构一套可以动态执行的对象导向 API 一般。你可以在应用程序执行的时期随意拼上或移除所需要的组件。依据 COM 这样的概念,发展应用程序就像是堆积木一样,每一个 COM 组件就是一块积木,你可以利用各式各样不同的积木,拼凑出你所需要的应用程序。
在实作上,COM 透过一组一组的接口 (Interface) 提供服务,所有 COM 组件的使用者,都必须透过这些 Interface 来使用组件提供的功能。OPC 的规格中便定义了许多 OPC Server 应该提供的 Interface,要撰写一个 OPC Server 的 COM 组件,你必须在你的组件中加入这些接口,并提供它们的实作,Client 便可以透过这些接口,操作连接到 OPC Server 的硬件装置,这也就是 OPC Server/Client 运作的方式。以下的图标可以让这样的概念更清晰。
架构
如前面所述,OPC Server 透过一组一组的接口提供服务,不过在实作的架构上,OPC Server 共分为三层:分别是 OPCServer, OPCGroup, OPCItem
其中每一个 OPCItem 对应到一个实际的硬件装置上的某一个 channel 或 port;每一个 OPCGroup 则包含了许多的 OPCItem,同时并定义这些 OPCItem 更新的时间、方式,以及提供读取 OPCItem 值的接口;而每一个 OPCServer 则包含若干个 OPCGroup,同时提供操作这些 OPCGroup 的接口。
图1可以较清楚地说明 OPCServer/OPCGroup/OPCItem 间的关系:
定制接口
接下来的这一节,我们将讨论 OPC Server 的重点,也就是每一组接口的定义,以及它所提供的功能。
OPCServer 提供的接口:
IOPCCommon
HRESULT SetLocaleID ( dwLcid ) 设定位置信息
HRESULT GetLocaleID ( pdwLcid ) 取得位置信息
HRESULT QueryAvailableLocaleIDs ( pdwCount, pdwLcid ) 查询可用的位置ID
HRESULT GetErrorString ( dwError, ppString) 取得错误信息字符串
HRESULT SetClientName (szName)设定Client的名称
HRESULT AddGroup(szName, bActive, dwRequestedUpdateRate, hClientGroup, pTimeBias, pPercentDeadband, dwLCID, phServerGroup, pRevisedUpdateRate, riid, ppUnk) 新增一个 OPCGroup
HRESULT GetErrorString(dwError, dwLocale, ppString) 取得错误信息字符串
HRESULT GetGroupByName(szName, riid, ppUnk) 依据名称取得OPCGroup 的介面
HRESULT GetStatus(ppServerStatus) 取得 OPCServer的状态信息
HRESULT SetClientName (szName)设定Clinet的名称RemoveGroup(hServerGroup, bForce)移除一个OPCGroup
HRESULT CreateGroupEnumerator(dwScope, riid, ppUnk) 产生一个OPCGroup 列举器
IConnectionPointContainer
HRESULT EnumConnectionPoints( IEnumConnectionPoints ppEnum) 列举所有的 Connection Points
HRESULT FindConnectionPoint( REFIID riid, IConnectionPoint ppCP)找出一个 Connection Point
IOPCItemProperties
HRESULT QueryAvailableProperties(szItemID, pdwCount,ppPropertyIDs, ppDescriptions, ppvtDataTypes ); 查询可用的 OPCItem属性
HRESULT GetItemProperties (szItemID, dwCount, pdwPropertyIDs,ppvData, ppErrors ) 取得 OPCItem 的属性
HRESULT LookupItemIDs( szItemID, dwCount, pdwPropertyIDs,ppszNewItemIDs, ppErrors )使用名称查询OPCItem 的 ID
IOPCBrowseServerAddressSpace (optional)
HRESULT QueryOrganization(pNameSpaceType )查询组织名称
HRESULT ChangeBrowsePosition(dwBrowseDirection, szString )变更浏览的位置
HRESULT BrowseOPCItemIDs( dwBrowseFilterType, szFilterCriteria, vtDataTypeFilter, dwAccessRightsFilter, ppIEnumString )浏览 OPCServer 内所有定义的 OPCItem
HRESULT GetItemID( szItemDataID, szItemID ) 取得 OPCItem 的 ID
HRESULT BrowseAccessPaths( szItemID, ppIEnumString )浏览存取OPCItem 的路径
OPCGroup Object 提供的介面
IOPCGroupStateMgt
HRESULT GetState(pUpdateRate, pActive, ppName, pTimeBias, pPercentDeadband, pLCID, phClientGroup, phServerGroup)取得OPCGroup的状态即设定信息
HRESULT SetState(pRequestedUpdateRate, pRevisedUpdateRate, pActive, pTimeBias, pPercentDeadband, pLCID, phClientGroup)设定OPCGroup 的状态信息
HRESULT SetName(szName)设定OPCGroup的名称
HRESULT CloneGroup(szName, riid, ppUnk) 复制一个OPCGroup
IOPCSyncIO
HRESULT Read(dwSource, dwCount, phServer, ppItemValues, ppErrors); 以同步方式读取OPCGroup内的OPCItem(s) 的值
HRESULT GetItemProperties (szItemID, dwCount, pdwPropertyIDs,ppvData, ppErrors ) 取得 OPCItem 的属性
HRESULT Write(dwCount, phServer, pItemValues, ppErrors) 以同步方式将值写入OPCGroup 内的 OPCItem(s)
IOPCAsyncIO2
HRESULT Read(dwCount, phServer, dwTransactionID, pdwCancelID, ppErrors,) 以非同步方式读取OPCGroup内的OPCItem(s)的值,值会在读取硬件的动作结束后以callback的形式传回
HRESULT SetState(pRequestedUpdateRate, pRevisedUpdateRate, pActive, pTimeBias, pPercentDeadband, pLCID, phClientGroup)设定OPCGroup的状态信息
HRESULT Write(dwCount, phServer, pItemValues, dwTransactionID, pdwCancelID, ppErrors)以非同步方式将值写入OPCGroup内的OPCItem(s)
HRESULT Cancel2 (dwCancelID) 取消前一次的非同步读取/写入
HRESULT Refresh2(dwSource, dwTransactionID, pdwCancelID) 更新 OPCGroup 内 OPCItem(s) 的值
HRESULT SetEnable(bEnable) 将 OPCGroup 设为 Enable
HRESULT GetEnable(pbEnable) 传回 OPCGroup 是否为 Enable
IOPCItemMgt
HRESULT AddItems(dwCount, pItemArray, ppAddResults, ppErrors); 在OPCGroup内新增OPCItem(s)
HRESULT ValidateItems(dwCount, pItemArray, bBlobUpdate, ppValidationResults, ppErrors)检查OPCItem(s)的名称是否可用
HRESULT RemoveItems(dwCount, phServer, ppErrors) 移除OPCGroup 内的 OPCItem(s)
HRESULT SetActiveState(dwCount, phServer, bActive, ppErrors)高定 OPCItem(s)是否为Avtive
HRESULT SetClientHandles(dwCount, phServer, phClient, ppErrors)设定 OPCItem(s) 的 handle
HRESULT SetDatatypes(dwCount, phServer, pRequestedDatatypes, ppErrors) 设定OPCItem(s)的数据类型
HRESULT CreateEnumerator(riid, ppUnk)产生OPCItems的列举器
IConnectionPointContainer
HRESULT EnumConnectionPoints( IEnumConnectionPoints ppEnum)列举所有的 Connection Points
HRESULT FindConnectionPoint( REFIID riid, IConnectionPoint ppCP)找出一个Connection Point
结论
OPC Server/Client 是一套利用微软的 COM/DCOM 技术达成工业自动化资料取得的架构。OPC Server 提供了许多的接口,Client 端通过这些接口,可以取得与 OPC Server 相连的硬件装置的信息,而无须了解这些硬件装置的细节信息。也就是说,程序设计者可以使用相同的程序代码,操作不同的硬件装置,充分达成 software reuse 的理想。同时,由于 COM/DCOM 已实作了网络部分的细节,也使得 Client 对 OPC Server 进行远程访问非常容易,使程序设计者很容易地达成远程控制的目标。
全国各地天气预报查询

上海市

  • 市辖区
  • 云南省

  • 临沧市
  • 云南省

  • 丽江市
  • 云南省

  • 保山市
  • 云南省

  • 大理白族自治州
  • 云南省

  • 德宏傣族景颇族自治州
  • 云南省

  • 怒江傈僳族自治州
  • 云南省

  • 文山壮族苗族自治州
  • 云南省

  • 昆明市
  • 云南省

  • 昭通市
  • 云南省

  • 普洱市
  • 云南省

  • 曲靖市
  • 云南省

  • 楚雄彝族自治州
  • 云南省

  • 玉溪市
  • 云南省

  • 红河哈尼族彝族自治州
  • 云南省

  • 西双版纳傣族自治州
  • 云南省

  • 迪庆藏族自治州
  • 内蒙古自治区

  • 乌兰察布市
  • 内蒙古自治区

  • 乌海市
  • 内蒙古自治区

  • 兴安盟
  • 内蒙古自治区

  • 包头市
  • 内蒙古自治区

  • 呼伦贝尔市
  • 内蒙古自治区

  • 呼和浩特市
  • 内蒙古自治区

  • 巴彦淖尔市
  • 内蒙古自治区

  • 赤峰市
  • 内蒙古自治区

  • 通辽市
  • 内蒙古自治区

  • 鄂尔多斯市
  • 内蒙古自治区

  • 锡林郭勒盟
  • 内蒙古自治区

  • 阿拉善盟
  • 北京市

  • 市辖区
  • 吉林省

  • 吉林市
  • 吉林省

  • 四平市
  • 吉林省

  • 延边朝鲜族自治州
  • 吉林省

  • 松原市
  • 吉林省

  • 白城市
  • 吉林省

  • 白山市
  • 吉林省

  • 辽源市
  • 吉林省

  • 通化市
  • 吉林省

  • 长春市
  • 四川省

  • 乐山市
  • 四川省

  • 内江市
  • 四川省

  • 凉山彝族自治州
  • 四川省

  • 南充市
  • 四川省

  • 宜宾市
  • 四川省

  • 巴中市
  • 四川省

  • 广元市
  • 四川省

  • 广安市
  • 四川省

  • 德阳市
  • 四川省

  • 成都市
  • 四川省

  • 攀枝花市
  • 四川省

  • 泸州市
  • 四川省

  • 甘孜藏族自治州
  • 四川省

  • 眉山市
  • 四川省

  • 绵阳市
  • 四川省

  • 自贡市
  • 四川省

  • 资阳市
  • 四川省

  • 达州市
  • 四川省

  • 遂宁市
  • 四川省

  • 阿坝藏族羌族自治州
  • 四川省

  • 雅安市
  • 天津市

  • 市辖区
  • 宁夏回族自治区

  • 中卫市
  • 宁夏回族自治区

  • 吴忠市
  • 宁夏回族自治区

  • 固原市
  • 宁夏回族自治区

  • 石嘴山市
  • 宁夏回族自治区

  • 银川市
  • 安徽省

  • 亳州市
  • 安徽省

  • 六安市
  • 安徽省

  • 合肥市
  • 安徽省

  • 安庆市
  • 安徽省

  • 宣城市
  • 安徽省

  • 宿州市
  • 安徽省

  • 池州市
  • 安徽省

  • 淮北市
  • 安徽省

  • 淮南市
  • 安徽省

  • 滁州市
  • 安徽省

  • 芜湖市
  • 安徽省

  • 蚌埠市
  • 安徽省

  • 铜陵市
  • 安徽省

  • 阜阳市
  • 安徽省

  • 马鞍山市
  • 安徽省

  • 黄山市
  • 山东省

  • 东营市
  • 山东省

  • 临沂市
  • 山东省

  • 威海市
  • 山东省

  • 德州市
  • 山东省

  • 日照市
  • 山东省

  • 枣庄市
  • 山东省

  • 泰安市
  • 山东省

  • 济南市
  • 山东省

  • 济宁市
  • 山东省

  • 淄博市
  • 山东省

  • 滨州市
  • 山东省

  • 潍坊市
  • 山东省

  • 烟台市
  • 山东省

  • 聊城市
  • 山东省

  • 菏泽市
  • 山东省

  • 青岛市
  • 山西省

  • 临汾市
  • 山西省

  • 吕梁市
  • 山西省

  • 大同市
  • 山西省

  • 太原市
  • 山西省

  • 忻州市
  • 山西省

  • 晋中市
  • 山西省

  • 晋城市
  • 山西省

  • 朔州市
  • 山西省

  • 运城市
  • 山西省

  • 长治市
  • 山西省

  • 阳泉市
  • 广东省

  • 东莞市
  • 广东省

  • 中山市
  • 广东省

  • 云浮市
  • 广东省

  • 佛山市
  • 广东省

  • 广州市
  • 广东省

  • 惠州市
  • 广东省

  • 揭阳市
  • 广东省

  • 梅州市
  • 广东省

  • 汕头市
  • 广东省

  • 汕尾市
  • 广东省

  • 江门市
  • 广东省

  • 河源市
  • 广东省

  • 深圳市
  • 广东省

  • 清远市
  • 广东省

  • 湛江市
  • 广东省

  • 潮州市
  • 广东省

  • 珠海市
  • 广东省

  • 肇庆市
  • 广东省

  • 茂名市
  • 广东省

  • 阳江市
  • 广东省

  • 韶关市
  • 广西壮族自治区

  • 北海市
  • 广西壮族自治区

  • 南宁市
  • 广西壮族自治区

  • 崇左市
  • 广西壮族自治区

  • 来宾市
  • 广西壮族自治区

  • 柳州市
  • 广西壮族自治区

  • 桂林市
  • 广西壮族自治区

  • 梧州市
  • 广西壮族自治区

  • 河池市
  • 广西壮族自治区

  • 玉林市
  • 广西壮族自治区

  • 百色市
  • 广西壮族自治区

  • 贵港市
  • 广西壮族自治区

  • 贺州市
  • 广西壮族自治区

  • 钦州市
  • 广西壮族自治区

  • 防城港市
  • 新疆维吾尔自治区

  • 乌鲁木齐市
  • 新疆维吾尔自治区

  • 伊犁哈萨克自治州
  • 新疆维吾尔自治区

  • 克孜勒苏柯尔克孜自治州
  • 新疆维吾尔自治区

  • 克拉玛依市
  • 新疆维吾尔自治区

  • 博尔塔拉蒙古自治州
  • 新疆维吾尔自治区

  • 吐鲁番市
  • 新疆维吾尔自治区

  • 和田地区
  • 新疆维吾尔自治区

  • 哈密市
  • 新疆维吾尔自治区

  • 喀什地区
  • 新疆维吾尔自治区

  • 塔城地区
  • 新疆维吾尔自治区

  • 巴音郭楞蒙古自治州
  • 新疆维吾尔自治区

  • 昌吉回族自治州
  • 新疆维吾尔自治区

  • 自治区直辖县级行政区划
  • 新疆维吾尔自治区

  • 阿克苏地区
  • 新疆维吾尔自治区

  • 阿勒泰地区
  • 江苏省

  • 南京市
  • 江苏省

  • 南通市
  • 江苏省

  • 宿迁市
  • 江苏省

  • 常州市
  • 江苏省

  • 徐州市
  • 江苏省

  • 扬州市
  • 江苏省

  • 无锡市
  • 江苏省

  • 泰州市
  • 江苏省

  • 淮安市
  • 江苏省

  • 盐城市
  • 江苏省

  • 苏州市
  • 江苏省

  • 连云港市
  • 江苏省

  • 镇江市
  • 江西省

  • 上饶市
  • 江西省

  • 九江市
  • 江西省

  • 南昌市
  • 江西省

  • 吉安市
  • 江西省

  • 宜春市
  • 江西省

  • 抚州市
  • 江西省

  • 新余市
  • 江西省

  • 景德镇市
  • 江西省

  • 萍乡市
  • 江西省

  • 赣州市
  • 江西省

  • 鹰潭市
  • 河北省

  • 保定市
  • 河北省

  • 唐山市
  • 河北省

  • 廊坊市
  • 河北省

  • 张家口市
  • 河北省

  • 承德市
  • 河北省

  • 沧州市
  • 河北省

  • 石家庄市
  • 河北省

  • 秦皇岛市
  • 河北省

  • 衡水市
  • 河北省

  • 邢台市
  • 河北省

  • 邯郸市
  • 河南省

  • 三门峡市
  • 河南省

  • 信阳市
  • 河南省

  • 南阳市
  • 河南省

  • 周口市
  • 河南省

  • 商丘市
  • 河南省

  • 安阳市
  • 河南省

  • 平顶山市
  • 河南省

  • 开封市
  • 河南省

  • 新乡市
  • 河南省

  • 洛阳市
  • 河南省

  • 漯河市
  • 河南省

  • 濮阳市
  • 河南省

  • 焦作市
  • 河南省

  • 省直辖县级行政区划
  • 河南省

  • 许昌市
  • 河南省

  • 郑州市
  • 河南省

  • 驻马店市
  • 河南省

  • 鹤壁市
  • 浙江省

  • 丽水市
  • 浙江省

  • 台州市
  • 浙江省

  • 嘉兴市
  • 浙江省

  • 宁波市
  • 浙江省

  • 杭州市
  • 浙江省

  • 温州市
  • 浙江省

  • 湖州市
  • 浙江省

  • 绍兴市
  • 浙江省

  • 舟山市
  • 浙江省

  • 衢州市
  • 浙江省

  • 金华市
  • 海南省

  • 三亚市
  • 海南省

  • 三沙市
  • 海南省

  • 儋州市
  • 海南省

  • 海口市
  • 海南省

  • 省直辖县级行政区划
  • 湖北省

  • 十堰市
  • 湖北省

  • 咸宁市
  • 湖北省

  • 孝感市
  • 湖北省

  • 宜昌市
  • 湖北省

  • 恩施土家族苗族自治州
  • 湖北省

  • 武汉市
  • 湖北省

  • 省直辖县级行政区划
  • 湖北省

  • 荆州市
  • 湖北省

  • 荆门市
  • 湖北省

  • 襄阳市
  • 湖北省

  • 鄂州市
  • 湖北省

  • 随州市
  • 湖北省

  • 黄冈市
  • 湖北省

  • 黄石市
  • 湖南省

  • 娄底市
  • 湖南省

  • 岳阳市
  • 湖南省

  • 常德市
  • 湖南省

  • 张家界市
  • 湖南省

  • 怀化市
  • 湖南省

  • 株洲市
  • 湖南省

  • 永州市
  • 湖南省

  • 湘潭市
  • 湖南省

  • 湘西土家族苗族自治州
  • 湖南省

  • 益阳市
  • 湖南省

  • 衡阳市
  • 湖南省

  • 邵阳市
  • 湖南省

  • 郴州市
  • 湖南省

  • 长沙市
  • 甘肃省

  • 临夏回族自治州
  • 甘肃省

  • 兰州市
  • 甘肃省

  • 嘉峪关市
  • 甘肃省

  • 天水市
  • 甘肃省

  • 定西市
  • 甘肃省

  • 平凉市
  • 甘肃省

  • 庆阳市
  • 甘肃省

  • 张掖市
  • 甘肃省

  • 武威市
  • 甘肃省

  • 甘南藏族自治州
  • 甘肃省

  • 白银市
  • 甘肃省

  • 酒泉市
  • 甘肃省

  • 金昌市
  • 甘肃省

  • 陇南市
  • 福建省

  • 三明市
  • 福建省

  • 南平市
  • 福建省

  • 厦门市
  • 福建省

  • 宁德市
  • 福建省

  • 泉州市
  • 福建省

  • 漳州市
  • 福建省

  • 福州市
  • 福建省

  • 莆田市
  • 福建省

  • 龙岩市
  • 西藏自治区

  • 山南市
  • 西藏自治区

  • 拉萨市
  • 西藏自治区

  • 日喀则市
  • 西藏自治区

  • 昌都市
  • 西藏自治区

  • 林芝市
  • 西藏自治区

  • 那曲市
  • 西藏自治区

  • 阿里地区
  • 贵州省

  • 六盘水市
  • 贵州省

  • 安顺市
  • 贵州省

  • 毕节市
  • 贵州省

  • 贵阳市
  • 贵州省

  • 遵义市
  • 贵州省

  • 铜仁市
  • 贵州省

  • 黔东南苗族侗族自治州
  • 贵州省

  • 黔南布依族苗族自治州
  • 贵州省

  • 黔西南布依族苗族自治州
  • 辽宁省

  • 丹东市
  • 辽宁省

  • 大连市
  • 辽宁省

  • 抚顺市
  • 辽宁省

  • 朝阳市
  • 辽宁省

  • 本溪市
  • 辽宁省

  • 沈阳市
  • 辽宁省

  • 盘锦市
  • 辽宁省

  • 营口市
  • 辽宁省

  • 葫芦岛市
  • 辽宁省

  • 辽阳市
  • 辽宁省

  • 铁岭市
  • 辽宁省

  • 锦州市
  • 辽宁省

  • 阜新市
  • 辽宁省

  • 鞍山市
  • 重庆市

  • 重庆市

  • 市辖区
  • 陕西省

  • 咸阳市
  • 陕西省

  • 商洛市
  • 陕西省

  • 安康市
  • 陕西省

  • 宝鸡市
  • 陕西省

  • 延安市
  • 陕西省

  • 榆林市
  • 陕西省

  • 汉中市
  • 陕西省

  • 渭南市
  • 陕西省

  • 西安市
  • 陕西省

  • 铜川市
  • 青海省

  • 果洛藏族自治州
  • 青海省

  • 海东市
  • 青海省

  • 海北藏族自治州
  • 青海省

  • 海南藏族自治州
  • 青海省

  • 海西蒙古族藏族自治州
  • 青海省

  • 玉树藏族自治州
  • 青海省

  • 西宁市
  • 青海省

  • 黄南藏族自治州
  • 黑龙江省

  • 七台河市
  • 黑龙江省

  • 伊春市
  • 黑龙江省

  • 佳木斯市
  • 黑龙江省

  • 双鸭山市
  • 黑龙江省

  • 哈尔滨市
  • 黑龙江省

  • 大兴安岭地区
  • 黑龙江省

  • 大庆市
  • 黑龙江省

  • 牡丹江市
  • 黑龙江省

  • 绥化市
  • 黑龙江省

  • 鸡西市
  • 黑龙江省

  • 鹤岗市
  • 黑龙江省

  • 黑河市
  • 黑龙江省

  • 齐齐哈尔市